home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / boot / loadppclib.lha / loadppclib / src / load040lib.e next >
Text File  |  2000-09-02  |  4KB  |  194 lines

  1. -> FILE: ESrc:Own/load040lib.e          REV: 1 --- load 68040.library on BlizzPPC
  2. /* History
  3.    0      Started in September 2000.
  4. */
  5.  
  6. OPT PREPROCESS
  7.  
  8. #define VERSION 'load040lib 1.0.0 (2.9.2000)'
  9. #define LIBNAME '68040.library'
  10.  
  11. MODULE 'dos/dos','dos/doshunks','exec/memory','exec/execbase',
  12.        'graphics/gfxbase','exec/resident'
  13.  
  14. ENUM ARG_LIB,ARG_FORCE,NUMARGS
  15.  
  16. ENUM ER_OK,ER_PARAM,ER_ALREADY,ER_NOBPPC,ER_LOADSEG,ER_NOTLIB,
  17.      ER_NOTPPCLIB,ER_ADDPPCLIB
  18.  
  19. DEF array[NUMARGS]:ARRAY OF LONG
  20.  
  21. PROC main() HANDLE
  22.   DEF attnflags
  23.   DEF rdargs = NIL, name:PTR TO CHAR, ioerr, ret
  24.   DEF r, pname[64]:STRING
  25.   DEF thelib, seglist = NIL, segment:PTR TO LONG, tag:PTR TO rt, seglen
  26.   DEF ids, islibrary = 0, isthelib = 0
  27.  
  28.   IF (KickVersion(37) = 0)
  29.     WriteF('This program requires AmigaOS 2.04+\n')
  30.     RETURN RETURN_FAIL
  31.   ENDIF
  32.  
  33.   attnflags := extattnflags(Int(execbase + $128))
  34.   IF ( ((attnflags AND AFF_68040) = 0) OR ((attnflags AND $80) <> 0) )
  35.     PrintF('This program requires 68040 CPU\n')
  36.     RETURN RETURN_FAIL
  37.   ENDIF
  38.  
  39.   -> test if it's there already...
  40.   Forbid()
  41.   ids := FindName(execbase + 378, LIBNAME)
  42.   Permit()
  43.   IF (ids) THEN Raise(ER_ALREADY)
  44.  
  45.   FOR r := 0 TO NUMARGS - 1; array[r] := 0; ENDFOR
  46.   IF ((rdargs := ReadArgs('LIBRARY,FORCE/S',
  47.       array, NIL)) = NIL) THEN Raise(ER_PARAM)
  48.  
  49.   IF (array[ARG_LIB])
  50.     name := array[ARG_LIB]
  51.   ELSE
  52.     name := 'libs:' + LIBNAME
  53.   ENDIF
  54.  
  55.   -> see if the HW is there...
  56.   Forbid()
  57.   ids := FindResident('BlizzardPPC.IDTag')
  58.   Permit()
  59.   IF ((ids = NIL) AND (array[ARG_FORCE] = 0)) THEN Raise(ER_NOBPPC)
  60.  
  61.   -> load the seglist
  62.   IF ((seglist := LoadSeg(name)) = NIL) THEN Raise(ER_LOADSEG)
  63.  
  64.  
  65.   -> do the stuff in forbid...
  66.   Forbid()
  67.   IF (FindName(execbase + 378, LIBNAME) = NIL)
  68.  
  69.     -> find the ROMTag in seglist
  70.     segment := seglist * 4
  71.  
  72.     WHILE (seglist <> NIL) AND (segment <> NIL)
  73.  
  74.       seglen := segment[-1] - 8 - SIZEOF rt
  75.       tag := segment + 2
  76.  
  77.       WHILE (seglist <> NIL) AND (seglen > 0)
  78.  
  79.         ADDQ.L  #2,tag
  80.         SUBQ.L  #2,seglen
  81.  
  82.         IF ((tag.matchword = RTC_MATCHWORD) AND
  83.           (tag.matchtag) = tag)
  84.  
  85.           islibrary := 1
  86.  
  87.           -> check name
  88.           IF (StrCmp(tag.name, LIBNAME))
  89.  
  90.             isthelib := 1
  91.  
  92.             -> init the resident.
  93.             -> NOTE: emulates ROM-init with seglist = NIL
  94.             InitResident(tag, NIL)
  95.  
  96.             -> did it work?
  97.             IF (FindName(execbase + 378, LIBNAME))
  98.               -> success! prevent unloading
  99.               seglist := NIL
  100.             ENDIF
  101.           ENDIF
  102.         ENDIF
  103.       ENDWHILE
  104.       segment := segment[] * 4
  105.     ENDWHILE
  106.   ENDIF
  107.   Permit()
  108.  
  109.   IF (seglist)
  110.     IF (islibrary = 0) THEN Raise(ER_NOTLIB)
  111.     IF (isthelib = 0) THEN Raise(ER_NOTPPCLIB)
  112.     Raise(ER_ADDPPCLIB)
  113.   ENDIF
  114.  
  115. EXCEPT DO
  116.   IF (exception)
  117.     IF (ioerr := IoErr()) THEN PrintFault(ioerr, NIL)
  118.     GetProgramName(pname, StrMax(pname) - 1)
  119.     PrintF('\s: \s\s\n', pname,
  120.            ListItem(['', 'argument error',
  121.                     'library already in memory',
  122.                     'Blizzard PPC not found, FORCE to override',
  123.                     'could not loadseg', 'file is not a library',
  124.                     'file is not a ',
  125.                     'could not add '
  126.                     ], exception),
  127.            IF ((exception = ER_NOTLIB) OR
  128.                (exception = ER_NOTPPCLIB)) THEN LIBNAME ELSE ''
  129.            )
  130.     ret := RETURN_ERROR
  131.   ELSE
  132.     ret := RETURN_OK
  133.   ENDIF
  134.  
  135.   IF (seglist) THEN UnLoadSeg(seglist)
  136.   IF (rdargs) THEN FreeArgs(rdargs)
  137. ENDPROC ret
  138.  
  139. CHAR '$VER: ',VERSION,0
  140.  
  141.  
  142. PROC extattnflags(flags)
  143.   DEF orren = 0
  144.   IF ((flags AND AFF_68040) AND ((flags AND $80) = 0))
  145.     MOVE.L  A5,-(A7)
  146.     LEA     check040(PC),A5
  147.     JSR     -$78(A6)
  148.     JSR     -$1E(A6)
  149.     JSR     -$7E(A6)
  150.     MOVE.L  (A7)+,A5
  151.     MOVE.L  D0,orren
  152.   ENDIF
  153.   RETURN flags OR orren
  154.  
  155. check040:
  156.   INT     $4E7A,$8801      -> MOVEC VBR,A0
  157.   MOVE.L  $10(A0),-(A7)
  158.   MOVE.L  $2C(A0),-(A7)
  159.   MOVE.L  A0,-(A7)
  160.   LEA     c040illegal(PC),A1
  161.   MOVE.L  A1,$10(A0)
  162.   MOVE.L  A1,$2C(A0)
  163.   INT     $F518,$F4F8,$F4D8
  164.  
  165.   MOVEQ   #0,D0
  166.  
  167.   INT     $4E7A,$0008   -> MOVEC BUSCR,D0
  168.   INT     $4E7A,$0808   -> MOVEC PCR,D0
  169.  
  170.   NOP
  171.   NOP
  172.   MOVEQ   #1,D0
  173.  
  174. c040exit_illegal:
  175.   MOVE.L  (A7)+,A0
  176.   MOVE.L  (A7)+,$2C(A0)
  177.   MOVE.L  (A7)+,$10(A0)
  178.   INT     $F518,$F4F8,$F4D8
  179.   TST.L   D0
  180.   BEQ.S   c040_no040
  181.  
  182.   MOVE.L  #$00000080,D0
  183.  
  184. c040_no040:
  185.   NOP
  186.   RTE
  187.  
  188. c040illegal:
  189.   LEA     c040exit_illegal(PC),A0
  190.   MOVE.L  A0,2(A7)
  191.   NOP
  192.   RTE
  193. ENDPROC
  194.